package com.zry.service.upload;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.zry.constant.ALiYunOssConstants;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * Oss文件上传
 * @author Zry
 */

@Service
public class OssUploadService {

    /**
     * 基于程序上传
     * @param multipartFile
     * @param dir
     * @return
     */
    public String uploadFile(MultipartFile multipartFile,String dir){
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ALiYunOssConstants.endPoint;

        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = ALiYunOssConstants.accessKeyId;
        String accessKeySecret = ALiYunOssConstants.accessKeySecret;

        // 填写Bucket名称，例如examplebucket。
        String bucketName = ALiYunOssConstants.bucketName;

        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            if (!ossClient.doesBucketExist(bucketName)) {
                //创建bucket
                ossClient.createBucket(bucketName);
                //设置oss实例的访问权限：公共读
                ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            }

            // 获取文件上传的流
            InputStream inputStream = multipartFile.getInputStream();

            // 创建日期目录
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = sdf.format(new Date());

            // 获取文件名字
            String originalFilename = multipartFile.getOriginalFilename();
            String fileName = UUID.randomUUID().toString();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String newFileName = fileName + suffix;
            String fileUrl = dir + "/" + datePath + "/" + newFileName;

            ossClient.putObject(bucketName, fileUrl,inputStream);

            return "https://" + bucketName + "." + endpoint + "/" + fileUrl;
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }

    /**
     * 本地文件上传
     * @param file
     * @return
     */
    public String uploadFile(File file){
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ALiYunOssConstants.endPoint;

        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = ALiYunOssConstants.accessKeyId;
        String accessKeySecret = ALiYunOssConstants.accessKeySecret;

        // 填写Bucket名称，例如examplebucket。
        String bucketName = ALiYunOssConstants.bucketName;

        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 获取文件上传的流
            InputStream inputStream = new FileInputStream(file);

            // 创建日期目录
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = sdf.format(new Date());

            // 获取文件名字
            String originalFilename = file.getName();
            String fileName = UUID.randomUUID().toString();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String newFileName = fileName + suffix;
            String fileUrl =  datePath + "/" + newFileName;

            ossClient.putObject(bucketName, fileUrl,inputStream);

            return "https://" + bucketName + "." + endpoint + "/" + fileUrl;
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }

}
